package ufmg.aprendizado.ga;

import java.util.List;

import ufmg.aprendizado.classificador.Classificador;
import ufmg.aprendizado.classificador.Conjunto;
import ufmg.aprendizado.classificador.Instancia;
import ufmg.arcabouco.ga.IndividuoGA;

public class Fitness {

	public static double calcular(Conjunto conjunto, IndividuoGA individuo,
			List<Integer> treino) {

		// int hitByClassificador[] = new int[conjunto.getSize()];
		int hits = 0;
		double genome[] = individuo.getGenome();

		int tamanhoInstancia = treino.size();

		for (Integer i : treino) {
			int maxClass = 0;
			double maxScore = 0;
			int realClass = 0;

			for (int k = 1; k <= conjunto.getSizeClasses(); k++) {

				double score = 0;

				for (int c = 0; c < conjunto.getSize(); ++c) {

					Classificador classificador = conjunto
							.getClassificadorAt(c);
					Instancia instancia = classificador.getInstancia(i);
					realClass = instancia.getClasseReal();

					score += instancia.getScoreAt(k) * genome[c];
				}

				if (k != 1) {
					if (score > maxScore) {
						maxClass = k;
						maxScore = score;
					}
				} else {
					maxClass = 1;
					maxScore = score;
				}
			}
			if (realClass == maxClass) {
				hits++;
			}
		}
		// System.out.println("hits: "+hits);
		// System.out.println("tamanho: "+tamanhoInstancia);
		double acuracia = (double) hits / tamanhoInstancia;
		individuo.setFitness(acuracia);
		return acuracia;
	}

}
